线程安全的集合
ConcurrentHashMap：
putVal()操作
1、进入循环，实质是乐观锁。
2、先判断当前map是否为空，为空则初始化，
3、再判断当前插入节点是否为空，为空则进行CAS插入
（CAS比较并交换，原子操作。比较预期值与实际值是否相同，相同则更新。不相同，则已被其他线程更新，继续循环，进入下一步）
4、判断是否在扩容，有在扩容则帮助扩容，没有则进行下一步
5、此刻已经有hash冲突了，先加锁，遍历这个节点的链表，判断是覆盖还是插入

CopeOnWriteArrayList：只读是线程安全的列表，对列表修改会创建副本，避免读者看到未完成修改的数据

ConcurrentSkipListSet:类似于有序的ConcurrentHashMap